﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using Sql;
using System.Threading;

public partial class _Default : System.Web.UI.Page
{
    private string yil, ay;
    private DcSql cn, cn2, cn3;

    private string VT_Prim = "Prim";
    private string VT_MikroDB = "MikroDB";


    protected void btnHesapla_Click(object sender, EventArgs e)
    {
        cn = new DcSql();
        string HataMesaji = cn.DBBaglan(VT_MikroDB);


        cn2 = new DcSql();
        HataMesaji = cn2.DBBaglan(VT_Prim);

        cn3 = new DcSql();
        HataMesaji = cn3.DBBaglan(VT_Prim);



        yil = ASPxSpinEdit1.Value.ToString();
        ay = (ASPxComboBox1.SelectedIndex + 1).ToString();

        string deleteSql = "";

        Thread.Sleep(1000);

        deleteSql = " delete from FaturaEsleme where pFaturaHareketID in (select pFaturaHareketID from Fatura where nPrimBonusYil=" + yil + " and nPrimBonusAy=" + ay + ")" +
                    " delete Fatura where nPrimBonusYil=" + yil + " and nPrimBonusAy=" + ay +
                    " delete PrimBonus where  nPrimBonusYil=" + yil + " and nPrimBonusAy=" + ay;

        SqlCommand cmd = new SqlCommand(deleteSql, cn2.GetConn());
        cmd.ExecuteNonQuery();

        faturaBilgileriniKaydet();
        faturaEslemeIsleminiBaslat();
        bonusTutarlariniHesapla();


        
    }

    private void faturaBilgileriniKaydet()
    {

        //**Fatura tablosunda olmayan mikrodaki faturaları eşleme işlemi için fatura tablosuna aktarılacak.


        double bonusTutari = 0;
        string whereSql = " and month(cha_tarihi) = " + ay + " and year(cha_tarihi) = " + yil;



        string selectSql = "select 	cha_RECid_RECno,cha_meblag,cha_tarihi from CARI_HESAP_HAREKETLERI where  cha_evrak_tip=63 and cha_RECid_RECno not in (select pFaturaHareketID from Prim.dbo.Fatura) " + whereSql + "  order by cha_tarihi  ";
        string insertSql;
        SqlCommand cmd = new SqlCommand(selectSql, cn.GetConn());
        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {

            //Fatura Prim Tutarını Hesapla 
            selectSql = "  select IsNull(sum(PrimTutari),0) as ToplamPrimTutari " +
                   "  from " +
                   "   ( " +
                   " select " +
                   " case when  nFiyat1_Bitis>=sth_tutar and sth_tutar>=nFiyat1 then sth_tutar*nYuzde1/100 " +
                   " when  nFiyat2_Bitis>=sth_tutar and sth_tutar>=nFiyat2 then sth_tutar*nYuzde2/100 " +
                   " when  nFiyat3_Bitis>=sth_tutar and sth_tutar>=nFiyat3 then sth_tutar*nYuzde3/100 " +
                   " when  nFiyat4_Bitis>=sth_tutar and sth_tutar>=nFiyat4 then sth_tutar*nYuzde4/100 " +
                   "  else 0 end PrimTutari   " +

                   " from mikroDB.dbo.STOK_HAREKETLERI  a , PrimOran  b  ,Yuzde c " +
                   " where a.sth_stok_kod  COLLATE Turkish_CI_AS  = b.psth_stok_kod " +
                   " and sth_fat_recid_recno =" + reader.GetValue(0).ToString() +

           " ) tablo ";

            SqlCommand cmdselect = new SqlCommand(selectSql, cn2.GetConn());

            bonusTutari = Convert.ToDouble(cmdselect.ExecuteScalar());

            //bonusTutari = FaturaBonusTutariniBul();

            insertSql = "insert into Prim.dbo.Fatura values(" +
                reader.GetValue(0).ToString() + "," +
                "'" + Convert.ToDateTime(reader.GetValue(2)).ToString("MM.dd.yyyy") + "'" + "," +
                reader.GetValue(1).ToString().Replace(",", ".") + "," +
                reader.GetValue(1).ToString().Replace(",", ".") + ",-1," + ay + "," + yil + "," + bonusTutari.ToString().Replace(",", ".") + ")";


            SqlCommand cmd2 = new SqlCommand(insertSql, cn2.GetConn());

            try
            {
                cmd2.ExecuteNonQuery();
            }
            catch { }

        }

        reader.Close();
    }


    //private void fatura

    private void faturaEslemeIsleminiBaslat()
    {

        double kalanTahsilatTutari, faturaTutari, tahsilatBelgeTutari;
        int tahsilatHareketID, faturaHareketID;
        DateTime tahsilatTarihi;
        string personelKodu = "";

        string whereSql = " and month(cha_tarihi) = " + ay + " and year(cha_tarihi) = " + yil;

        string selectSql = "select cha_RECid_RECno,cha_kod,cha_meblag,cha_tarihi, " +
            " (select cari_temsilci_kodu from CARI_HESAPLAR where cha_kod=cari_kod ) as personelkodu  from CARI_HESAP_HAREKETLERI " +
            " where cha_evrak_tip in(1,34)  and 	cha_cari_cins=0 " + whereSql + "  order by cha_tarihi  ";

        string faturaSql;

        SqlCommand cmd = new SqlCommand(selectSql, cn.GetConn());
        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            tahsilatHareketID = Convert.ToInt32(reader.GetValue(0));
            kalanTahsilatTutari = Convert.ToDouble(reader.GetValue(2));
            tahsilatTarihi = Convert.ToDateTime(reader.GetValue(3));
            tahsilatBelgeTutari = Convert.ToDouble(reader.GetValue(2));
            personelKodu = reader.GetValue(4).ToString();
            // Eşlenmemiş Faturayı Bul ve Eşle
            faturaSql = " select cha_RECid_RECno,cha_kod,nKalanTutar " +
                " from  Fatura a,mikroDB.dbo.CARI_HESAP_HAREKETLERI b " +
                " where  a.pFaturaHareketID = b.cha_RECid_RECno " +
                " and    b.cha_kod = '" + reader.GetValue(1).ToString() + "'" +
                " and nKalanTutar>0 ";

            SqlCommand cmd2 = new SqlCommand(faturaSql, cn2.GetConn());
            SqlDataReader reader2 = cmd2.ExecuteReader();

            while (reader2.Read() && kalanTahsilatTutari > 0)
            {
                /*   1-Tahsilat Tutarı Faturaya Eşit Olabilir
                     2-Tahsilat Tutarı Fatura tutarında az olabilir(Parçalı ödeme)
                     3-Tahsilat Tutarı Fatura tutarında çok olabilir(Birden çok faturayı tek seferde ödeme olabilir.)   */
                faturaHareketID = Convert.ToInt32(reader2.GetValue(0));
                faturaTutari = Convert.ToDouble(reader2.GetValue(2));

                if (kalanTahsilatTutari >= faturaTutari)
                {
                    eslemeTablosunaKaydet(tahsilatHareketID, faturaHareketID, faturaTutari, tahsilatTarihi, tahsilatBelgeTutari, personelKodu);
                    kalanTahsilatTutari = kalanTahsilatTutari - faturaTutari;
                }
                else
                {
                    eslemeTablosunaKaydet(tahsilatHareketID, faturaHareketID, kalanTahsilatTutari, tahsilatTarihi, tahsilatBelgeTutari, personelKodu);
                    kalanTahsilatTutari = 0;
                }

            }

            reader2.Close();
        }

        reader.Close();

    }

    private void eslemeTablosunaKaydet(int tahsilatHareketID, int faturaHareketID, double eslemeTutari, DateTime tahsilatTarihi, double tahsilatBelgeTutari, string personelKodu)
    {


        double bonusTutari = 0;

        string sql = "select nPrimBonusTutari,nFaturaTutari from Fatura where pFaturaHareketID=" + faturaHareketID.ToString();
        SqlCommand cmd = new SqlCommand(sql, cn3.GetConn());
        SqlDataReader dr = cmd.ExecuteReader();

        try
        {
            if (dr.Read())
                bonusTutari = Convert.ToDouble(dr.GetValue(0)) * eslemeTutari / Convert.ToDouble(dr.GetValue(1));
        }
        catch { bonusTutari = 0; }

        dr.Close();

        string insertSql = " declare @primbonusid int "

              + " insert into PrimBonus values ('" + personelKodu + "'," + ay + "," + yil + ",1,"
              + bonusTutari.ToString().Replace(",", ".") + ",-1 )"
              + " set @primbonusid=@@IDENTITY "

              + "insert into FaturaEsleme values ( "
              + tahsilatHareketID.ToString() + ","
              + faturaHareketID.ToString() + ","
              + "'" + tahsilatTarihi.ToString("MM.dd.yyyy") + "'" + ","
              + tahsilatBelgeTutari.ToString().Replace(",", ".") + ","
              + eslemeTutari.ToString().Replace(",", ".") + ",@primbonusid," + ay + "," + yil + "," + bonusTutari.ToString().Replace(",", ".") + ")"

              + " update Fatura "
              + "  set nKalanTutar = nFaturaTutari - IsNull((select sum(nEslemeTutari) from FaturaEsleme where pFaturaHareketID=Fatura.pFaturaHareketID),0) "
              + "  where pFaturaHareketID= " + faturaHareketID.ToString();


        cmd = new SqlCommand(insertSql, cn3.GetConn());
        cmd.ExecuteNonQuery();
    }


    private void bonusTutarlariniHesapla()
    {
        double bonusTutari = 0, tahsilatTutari = 0;
        string bonusSql = "";
        string whereSql = " and month(cha_tarihi) = " + ay + " and year(cha_tarihi) = " + yil;
        string personelKodu = "";

        //Satış Bonuslarını Hesapla
        string selectSql = " select sum(cha_meblag),cari_temsilci_kodu from CARI_HESAP_HAREKETLERI a,CARI_HESAPLAR b,CARI_PERSONEL_TANIMLARI c " +
                          " where a.cha_kod=b.cari_kod and  b.cari_temsilci_kodu= c.cari_per_kod and  cha_evrak_tip in (1,34)   " + whereSql +
                          " group by cari_temsilci_kodu ";


        SqlCommand cmd = new SqlCommand(selectSql, cn.GetConn());
        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {



            tahsilatTutari = Convert.ToDouble(reader.GetValue(0));
            personelKodu = reader.GetValue(1).ToString();

            bonusSql = " select nBonusTutari from TahsilatBonus " +
                " where nTahsilatTutar1 >=" + tahsilatTutari.ToString().Replace(",", ".") +
                    " and " + tahsilatTutari.ToString().Replace(",", ".") + " <= nTahsilatTutar2 " +
                    " and nTahsilatSatis = 1  ";

            SqlCommand cmd2 = new SqlCommand(bonusSql, cn2.GetConn());

            try
            {
                bonusTutari = Convert.ToDouble(cmd2.ExecuteScalar());
                bonusTutariniKaydet(personelKodu, bonusTutari, 1);
            }
            catch { }
        }

        reader.Close();

        ///Tahsialt Bonuslarını hesapla
        ///

        selectSql = " select sum(cha_meblag),cari_temsilci_kodu from CARI_HESAP_HAREKETLERI a,CARI_HESAPLAR b,CARI_PERSONEL_TANIMLARI c " +
                         " where a.cha_kod=b.cari_kod and  b.cari_temsilci_kodu= c.cari_per_kod and  cha_evrak_tip=63    " + whereSql +
                         " group by cari_temsilci_kodu ";


        cmd = new SqlCommand(selectSql, cn.GetConn());
        reader = cmd.ExecuteReader();

        while (reader.Read())
        {



            tahsilatTutari = Convert.ToDouble(reader.GetValue(0));
            personelKodu = reader.GetValue(1).ToString();

            bonusSql = " select nBonusTutari from TahsilatBonus " +
                " where nTahsilatTutar1 >=" + tahsilatTutari.ToString().Replace(",", ".") +
                    " and " + tahsilatTutari.ToString().Replace(",", ".") + " <= nTahsilatTutar2 " +
                    " and nTahsilatSatis = 2  ";

            SqlCommand cmd2 = new SqlCommand(bonusSql, cn2.GetConn());

            try
            {
                bonusTutari = Convert.ToDouble(cmd2.ExecuteScalar());
                bonusTutariniKaydet(personelKodu, bonusTutari, 2);
            }
            catch { }
        }

        reader.Close();

    }


    private void bonusTutariniKaydet(string personelKodu, double bonusTutari, int satisTahsilat)
    {

        string insertSql = " insert into PrimBonus values ('" + personelKodu + "'," + ay + "," + yil + ",2,"
        + bonusTutari.ToString().Replace(",", ".") + "," + satisTahsilat.ToString() + " )";

        SqlCommand cmd = new SqlCommand(insertSql, cn3.GetConn());
        cmd.ExecuteNonQuery();


    }
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void ASPxCallback1_Callback(object source, DevExpress.Web.ASPxCallback.CallbackEventArgs e)
    {
        System.Threading.Thread.Sleep(1000);
    }
}